package com.aspire.aimini.model.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * AI配置数据传输对象
 *
 * @author wangguiyou
 * @date 2024-12-19
 */
@Data
@Accessors(chain = true)
public class AiConfigDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 配置ID
     */
    private Long id;

    /**
     * 用户ID
     */
    @NotNull(message = "用户ID不能为空")
    private Long userId;

    /**
     * 配置名称
     */
    @NotBlank(message = "配置名称不能为空")
    private String name;

    /**
     * 服务类型
     */
    @NotBlank(message = "服务类型不能为空")
    private String serviceType;

    /**
     * 服务提供商
     */
    @NotBlank(message = "服务提供商不能为空")
    private String provider;

    /**
     * 模型名称
     */
    @NotBlank(message = "模型名称不能为空")
    private String model;

    /**
     * API密钥
     */
    @NotBlank(message = "API密钥不能为空")
    private String apiKey;

    /**
     * API端点
     */
    private String apiEndpoint;

    /**
     * 配置参数（JSON格式）
     */
    private String parameters;

    /**
     * 是否为默认配置
     */
    private Boolean isDefault;

    /**
     * 是否启用
     */
    private Boolean isEnabled;

    /**
     * 每日配额限制
     */
    @Min(value = 0, message = "每日配额限制不能小于0")
    private Integer dailyQuota;

    /**
     * 今日已使用量
     */
    private Integer todayUsage;

    /**
     * 每次调用成本
     */
    @Min(value = 0, message = "每次调用成本不能小于0")
    private Double costPerCall;

    /**
     * 优先级（1-10）
     */
    @Min(value = 1, message = "优先级不能小于1")
    @Max(value = 10, message = "优先级不能大于10")
    private Integer priority;

    /**
     * 超时时间（秒）
     */
    @Min(value = 1, message = "超时时间不能小于1秒")
    private Integer timeout;

    /**
     * 重试次数
     */
    @Min(value = 0, message = "重试次数不能小于0")
    private Integer retryCount;

    /**
     * 描述
     */
    private String description;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

    /**
     * 配置参数Map（用于前端展示）
     */
    private Map<String, Object> parametersMap;

    /**
     * 连接状态
     */
    private String connectionStatus;

    /**
     * 最后测试时间
     */
    private LocalDateTime lastTestTime;

    /**
     * 配额使用率
     */
    private Double quotaUsageRate;

    /**
     * 是否接近配额限制
     */
    private Boolean nearQuotaLimit;

    /**
     * 是否超出配额
     */
    private Boolean quotaExceeded;

    /**
     * 平均响应时间（毫秒）
     */
    private Long avgResponseTime;

    /**
     * 成功率
     */
    private Double successRate;

    /**
     * 总调用次数
     */
    private Long totalCalls;

    /**
     * 成功调用次数
     */
    private Long successCalls;

    /**
     * 失败调用次数
     */
    private Long failedCalls;

    /**
     * 最后调用时间
     */
    private LocalDateTime lastCallTime;

    /**
     * 最后错误信息
     */
    private String lastError;

    /**
     * 获取脱敏后的API密钥
     */
    public String getMaskedApiKey() {
        if (apiKey == null || apiKey.length() <= 8) {
            return "****";
        }
        return apiKey.substring(0, 4) + "****" + apiKey.substring(apiKey.length() - 4);
    }

    /**
     * 检查是否可用
     */
    public boolean isAvailable() {
        return Boolean.TRUE.equals(isEnabled) && !Boolean.TRUE.equals(quotaExceeded);
    }

    /**
     * 检查是否接近配额限制
     */
    public boolean isNearQuotaLimit() {
        if (dailyQuota == null || dailyQuota <= 0) {
            return false;
        }
        double usageRate = (double) (todayUsage != null ? todayUsage : 0) / dailyQuota;
        return usageRate >= 0.8; // 使用率超过80%认为接近限制
    }

    /**
     * 检查是否超出配额
     */
    public boolean isQuotaExceeded() {
        if (dailyQuota == null || dailyQuota <= 0) {
            return false;
        }
        return (todayUsage != null ? todayUsage : 0) >= dailyQuota;
    }

    /**
     * 计算配额使用率
     */
    public double calculateQuotaUsageRate() {
        if (dailyQuota == null || dailyQuota <= 0) {
            return 0.0;
        }
        return (double) (todayUsage != null ? todayUsage : 0) / dailyQuota;
    }

    /**
     * 计算成功率
     */
    public double calculateSuccessRate() {
        if (totalCalls == null || totalCalls <= 0) {
            return 0.0;
        }
        return (double) (successCalls != null ? successCalls : 0) / totalCalls;
    }

    /**
     * 获取剩余配额
     */
    public int getRemainingQuota() {
        if (dailyQuota == null || dailyQuota <= 0) {
            return 0;
        }
        return Math.max(0, dailyQuota - (todayUsage != null ? todayUsage : 0));
    }

    /**
     * 获取配置状态描述
     */
    public String getStatusDescription() {
        if (!Boolean.TRUE.equals(isEnabled)) {
            return "已禁用";
        }
        if (Boolean.TRUE.equals(quotaExceeded)) {
            return "配额已用完";
        }
        if (isNearQuotaLimit()) {
            return "配额即将用完";
        }
        if ("connected".equals(connectionStatus)) {
            return "正常";
        }
        if ("disconnected".equals(connectionStatus)) {
            return "连接失败";
        }
        return "未知";
    }

    /**
     * 获取优先级描述
     */
    public String getPriorityDescription() {
        if (priority == null) {
            return "未设置";
        }
        if (priority >= 8) {
            return "高";
        }
        if (priority >= 5) {
            return "中";
        }
        return "低";
    }
}